package com.jdjc.suject.domin.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * 线程池的config管理
 */
@Configuration
public class ThreadPoolConfig {
    @Bean(name = "LableThreadPool")
    public ThreadPoolExecutor getLableThreadPool() {
        /**
         * 核心线程数：20。这是线程池中线程的最小数量，即使没有任务需要执行，这些线程也会被保留。
         * 最大线程数：100。这是线程池中线程的最大数量。如果当前线程数小于这个值，并且线程池中的所有线程都在忙碌，则会创建新的线程来处理任务。
         * 存活时间：5秒。这是线程在变为空闲状态后，在被终止之前可以保持空闲状态的时间。
         * 时间单位：TimeUnit.SECONDS。这是存活时间的单位s。
         * 工作队列：LinkedBlockingQueue<Runnable>(40)。这是一个可以容纳40个任务的阻塞队列。当所有核心线程都在忙碌时，新的任务会在这个队列中等待。
         * 线程工厂：new CustomNameThreadFactory("label")。这是自定义的创建新线程的工厂，并指定了线程的名称为label。
         * 拒绝策略：ThreadPoolExecutor.CallerRunsPolicy()。当线程池中的线程数达到最大值，且工作队列也满时，这个策略会使调用者所在的线程执行任务，这有助于防止任务的丢失，但可能会降低应用程序的响应速度
         */
        return new ThreadPoolExecutor(20, 100, 5, TimeUnit.SECONDS,
                new LinkedBlockingQueue<Runnable>(40),
                new CustomNameThreadFactory("label"),
                new ThreadPoolExecutor.CallerRunsPolicy());
    }
}
